home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / FILER / X-FILES.ZIP / 057 / !X-Files / c / module < prev    next >
Text File  |  1996-04-04  |  3KB  |  120 lines

  1. /* x-files main program */
  2.  
  3. #include "module.h"
  4.  
  5. #include "kernel.h"
  6. #include "swis.h"
  7. #include "chunks.h"
  8. #include "fshook.h"
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12.  
  13. static BOOL declared;
  14. void *wsp;
  15.  
  16. extern void entry_Open(void);
  17. extern void entry_GetBytes(void);
  18. extern void entry_PutBytes(void);
  19. extern void entry_Args(void);
  20. extern void entry_Close(void);
  21. extern void entry_File(void);
  22. extern void entry_Func(void);
  23. extern void entry_Ticker(void);
  24. extern int  Image_RO_Base;
  25.  
  26. static void xFiles__finalise(void)
  27. {
  28.    if (declared)
  29.    {
  30.       _kernel_swi_regs regs;
  31.    
  32.       regs.r[0] = 36;
  33.       regs.r[1] = xFiles_TYPE;
  34.    
  35.       (void) _kernel_swi(OS_FSControl, ®s, ®s);
  36.  
  37.       regs.r[0] = 0x1c;     /* TickerV */
  38.       regs.r[1] = (int) entry_Ticker;
  39.       regs.r[2] = (int) wsp;
  40.       (void) _kernel_swi(OS_Release, ®s, ®s);
  41.  
  42.       xFiles_Tidy();
  43.    }
  44. }
  45.  
  46. static _kernel_oserror *xFiles__declareFS(void)
  47. {
  48.    _kernel_swi_regs regs;
  49.    _kernel_oserror *err;
  50.    static int fsInfoBlock[10];
  51.  
  52.    fsInfoBlock[ 0] = 0;
  53.    fsInfoBlock[ 1] = xFiles_TYPE;
  54.    fsInfoBlock[ 2] = (int) entry_Open         - Image_RO_Base;
  55.    fsInfoBlock[ 3] = (int) entry_GetBytes     - Image_RO_Base;
  56.    fsInfoBlock[ 4] = (int) entry_PutBytes     - Image_RO_Base;
  57.    fsInfoBlock[ 5] = (int) entry_Args         - Image_RO_Base;
  58.    fsInfoBlock[ 6] = (int) entry_Close        - Image_RO_Base;
  59.    fsInfoBlock[ 7] = (int) entry_File         - Image_RO_Base;
  60.  
  61.    /* Next item duplicated because of worrying discrepency on crap
  62.     * green PRM page 4-5.
  63.     */
  64.  
  65.    fsInfoBlock[ 8] = (int) &entry_Func         - Image_RO_Base;
  66.    fsInfoBlock[ 9] = (int) &entry_Func         - Image_RO_Base;
  67.  
  68.    regs.r[0] = 35;
  69.    regs.r[1] = Image_RO_Base;
  70.    regs.r[2] = (int) &fsInfoBlock - Image_RO_Base;
  71.    regs.r[3] = (int) wsp;
  72.  
  73.    if (err = _kernel_swi(OS_FSControl, ®s, ®s), err)
  74.       return err;
  75.  
  76.    regs.r[0] = 0x1c;     /* TickerV */
  77.    regs.r[1] = (int) entry_Ticker;
  78.    regs.r[2] = (int) wsp;
  79.    if (err = _kernel_swi(OS_Claim, ®s, ®s), err)
  80.       return err;
  81.  
  82.    declared = TRUE;
  83.  
  84.    return NULL;
  85. }
  86.  
  87. void xFiles_service(int nService, _kernel_swi_regs *regs, void *ws)
  88. {
  89.    (void) regs;
  90.    (void) ws;
  91.  
  92.    switch (nService)
  93.    {
  94.       case 0x00040:     /* Service_FSRedeclare */
  95.          (void) xFiles__declareFS();
  96.          break;
  97.    }
  98. }
  99.  
  100. _kernel_oserror *xFiles_initialise(char *cmd, int pod, void *ws)
  101. {
  102.    _kernel_oserror *err;
  103.    (void) cmd;
  104.    (void) pod;
  105.  
  106.    wsp = ws;
  107.  
  108.    atexit(xFiles__finalise);
  109.  
  110. #if 0
  111.    if (err = InstallFSHook(), err)
  112.       return err;
  113. #endif      
  114.  
  115.    if (err = xFiles__declareFS(), err)
  116.       return err;
  117.  
  118.    return xFiles_InitCache(16384);
  119. }
  120.